//输入一个链表的头节点，从尾到头反过来返回每个节点的值（用数组返回）。 
//
// 
//
// 示例 1： 
//
// 输入：head = [1,3,2]
//输出：[2,3,1] 
//
// 
//
// 限制： 
//
// 0 <= 链表长度 <= 10000 
// Related Topics 链表 
// 👍 117 👎 0
import java.util.Stack;
//leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] reversePrint(ListNode head) { // 写了三种
        // 方法一 暴力栈
//        Stack<Integer> stack = new Stack();
//        ListNode temp = head;
//        while(temp != null){
//            stack.push(temp.val);
//            temp = temp.next;
//        }
//        int size = stack.size();
//        int[] res = new int[size];
//        for (int i = 0; i < size; i++) {
//            res[i] = stack.pop();
//        }
//        return res;

        // 方法二 操控节点，更快，但是改变原数据了
//        ListNode cur = head;
//        ListNode pre = null;
//        ListNode next;
//        if (cur == null) return new int[0];
//        if (cur.next == null) return new int[]{cur.val};
//        int size = 0;
//        while (cur != null){ // 换next指针不换val，顺便调查链表长度
//            size++;
//            next = cur.next;
//            cur.next = pre;
//            pre = cur;
//            cur = next;
//        }
//        int[] res = new int[size];
//        int index = 0;
//        while(pre != null){// 因为pre = cur，所以想要遍历要用pre
//            res[index] = pre.val;
//            index++;
//            pre = pre.next;
//        }
//        return res;

        // 方法三，不用栈不用递归，倒着存入数组，正着打印，没改变原数据
        ListNode temp = head;
        int size = 0;
        while (temp != null){
            size++;
            temp = temp.next;
        }
        int[] res = new int[size];
        temp = head;
        for (int i = size - 1; i >= 0; i--){
            res[i] = temp.val;
            temp = temp.next;
        }
        return res;
    }
}
//leetcode submit region end(Prohibit modification and deletion)
